1. Field of the Invention
The present invention generally relates to data storage systems and, more particularly, to storage systems that store redundant data.
2. Description of the Related Art
Modern mass storage subsystems are used within computer networks to provide increasing storage capacities to fulfill user demands from host computer system applications. Unfortunately, access to the memory of the mass storage subsystems is slow, and as the sizes of the storage systems grow, access becomes even slower. A cost effective, prior art solution to this problem provides a cache between the host computer and the storage system. Caches are used to temporarily store instructions or data that may be repeatedly accessed by a host, in order to increase the processing speed by avoiding the longer step of loading the instructions or data from the memory of the storage system. More specifically, the first time an instruction or data location is addressed, it must be accessed from the lower speed disk memory. Subsequent accesses to the same instruction or data are done via the faster cache memory, thereby minimizing access time and enhancing overall system performance. Typically, each cache is associated with a cache controller, which manages the transfer of data between the host and the cache memory.
With the increasing size of the mass storage subsystems, the reliance on such large mass storage subsystems also generates a need for enhanced reliability. Various system configurations and geometries are commonly applied to meet the demands for higher storage capacity while maintaining or enhancing reliability of the mass storage subsystems.
A popular solution to these demands for increased capacity and reliability is the use of multiple storage modules configured in geometries that permit redundancy of stored data to assure data integrity in the case of system failures. Some of these systems in particular include redundant cache controllers. In some prior art systems including redundant cache controllers, a cache memory is shared by the redundant cache controllers, such that if one of the cache controllers fails, the redundant cache controller(s) maintains access to the cache memory and the data or instructions stored in the cache memory by the failed controller. Unfortunately, in such configurations, if the shared cache memory fails, any data or instructions stored in the failed cache memory would be lost.
In other systems including redundant cache controllers, each cache controller includes a dedicated cache memory. A significant challenge in such systems with redundant cache controllers is maintaining “cache coherency” without adversely affecting system performance. One prior art solution to the problem of maintaining cache coherency, is to maintain identical caches in each of the subsystems. In a first cache coherency maintenance solution, the entire cache may be periodically transmitted from the main cache to each of the remaining redundant cache(s). In a second cache coherency maintenance solution, each time a cache operation takes place on one cache, the redundant cache(s) is (are) notified of the operation and sent any corresponding data. As such, each of the redundant cache(s) is (are) updated. These two implementations exhibit various shortcomings upon a failure of a storage controller. Firstly, when one of the storage controllers fails, the cache memory of the redundant storage controller must subsequently be entirely searched for the mirrored data from the cache memory of the failed storage controller upon subsequent storage requests. Secondly, when one of the storage controllers fails, the redundancy of the subsystem is lost. Any data in the cache memory of the remaining storage controller is vulnerable to loss.
Therefore it is apparent that a need exists in the art for a method and apparatus for quickly accessing the cache data of a failed controller from a redundant controller, which further reduces the overhead processing time of a data storage system and reestablishes the redundancy of the data storage system.